using System;
using System.Collections;


namespace SharpWars.Core.AI
{
    public class Node : IComparable
    {
        //Fields

        public Node ParrentNode;    //rodzic
        public Node EndNode;        //koniec 
        public int Cost;                   //koszt
        public int X, Y;                   //wspolzedne X.Y
        public int g;                      //zsumowany koszt drogi dotychczasowej
        public int h;                      //obloczony koszt za pomoca metody Euclidean (obliczenie odleglosci pomiedzy puntkami)
        
        //calkowity koszt drogi do punktu koncowego
        public int TotalCost
        {
            get
            {
                return g + h; 
            }
            set
            {
                TotalCost = value;
            }
        }


        //Konstruktor

        public Node(Node ParrentNode, Node EndNode, int Cost, int X, int Y)
        {
            this.ParrentNode = ParrentNode;
            this.EndNode = EndNode;
            this.Cost = Cost;
            this.X = X;
            this.Y = Y;
        }


        private void InitNode()
        {
            this.g = (ParrentNode != null) ? this.ParrentNode.g + Cost : Cost;
            this.h = (EndNode != null) ? (int)Euclidean() : 0;
        }
        
        //obliczanie kosztu do punktu docelowego
        private double Euclidean ()
        {
            double EX = this.X - this.EndNode.X;
            double EY = this.Y - this.EndNode.Y;

            return Math.Sqrt((EX*EX)+(EY*EY));
        }

        //porownanie kosztu dwoch obiektow
        public int CompareTo (object obj)
        {
            Node n = (Node)obj;
            int cFactor = this.TotalCost - n.TotalCost;
            return cFactor;
        }

        //sprawdzanie czy nie porownujemy tego samego obiektu
        public bool IsMatch(Node n)
		{
			if (n!=null)
				return (X==n.X && Y==n.Y);
			else
				return false;
		}

        //metoda do wyszukiwania sasiednich drog sprawdza elementy tablicy naokolo punktu w ktorym sie znajdujemy
		public ArrayList GetSuccessors()
		{
			ArrayList successors = new ArrayList ();

			for (int xd=-1;xd<=1;xd++)
			{
				for (int yd=-1;yd<=1;yd++)
				{
					/*if (Map.Paths (X+xd,Y+yd) !=-1)
					{
						Node n = new Node (this,this.EndNode ,Map.Paths (X+xd,Y+yd) ,X+xd,Y+yd);
						if (!n.IsMatch (this.ParrentNode) && !n.IsMatch (this))
                            successors.Add (n);

					}
                     */
				}
			}
			return successors;
		}


    }
}
